macos: tweak gravity while resizing
authorChristian Hergert <chergert@redhat.com>
Thu, 29 Oct 2020 17:30:41 +0000 (10:30 -0700)
committerChristian Hergert <chergert@redhat.com>
Thu, 29 Oct 2020 17:57:02 +0000 (10:57 -0700)
This helps a situation where the window contents has not changed
in time for a drawing. Setting the texture gravity helps that side or
corner to be less jittery while moving.

Ideally, we can get to a point where we are synchronized and keeping
up with drawing fast enough to not need this. That may require some
work to drive frame clocks from drawRect: though.

gdk/macos/GdkMacosWindow.c

index c4a133afcc39874e3703f4ced05ba560341dc417..b511233cdf6ccb2983699d7b2e25bfb62df14a21 100644 (file)
@@ -25,6 +25,7 @@
 
 #import "GdkMacosBaseView.h"
 #import "GdkMacosCairoView.h"
+#import "GdkMacosGLView.h"
 #import "GdkMacosWindow.h"
 
 #include "gdkmacosdisplay-private.h"
 
       _gdk_macos_display_break_all_grabs (GDK_MACOS_DISPLAY (display), time);
 
+      /* Reset gravity */
+      if (GDK_IS_MACOS_GL_VIEW ([self contentView]))
+        [[[self contentView] layer] setContentsGravity:kCAGravityBottomLeft];
+
       break;
     }
 
   inManualResize = YES;
   resizeEdge = edge;
 
+  if (GDK_IS_MACOS_GL_VIEW ([self contentView]))
+    {
+      CALayerContentsGravity gravity = kCAGravityBottomLeft;
+
+      switch (edge)
+        {
+        default:
+        case GDK_SURFACE_EDGE_NORTH:
+          gravity = kCAGravityTopLeft;
+          break;
+
+        case GDK_SURFACE_EDGE_NORTH_WEST:
+          gravity = kCAGravityTopRight;
+          break;
+
+        case GDK_SURFACE_EDGE_SOUTH_WEST:
+        case GDK_SURFACE_EDGE_WEST:
+          gravity = kCAGravityBottomRight;
+          break;
+
+        case GDK_SURFACE_EDGE_SOUTH:
+        case GDK_SURFACE_EDGE_SOUTH_EAST:
+          gravity = kCAGravityBottomLeft;
+          break;
+
+        case GDK_SURFACE_EDGE_EAST:
+          gravity = kCAGravityBottomLeft;
+          break;
+
+        case GDK_SURFACE_EDGE_NORTH_EAST:
+          gravity = kCAGravityTopLeft;
+          break;
+        }
+
+      [[[self contentView] layer] setContentsGravity:gravity];
+    }
+
   initialResizeFrame = [self frame];
   initialResizeLocation = [self convertPointToScreen:[self mouseLocationOutsideOfEventStream]];
 }